Skip to content

01 忙碌的士兵 - CPU 与 top 指令

top 实时显示系统运行状态

  • top 指令是 Linux 下常用的性能分析工具
    • 实时显示系统中各个进程的资源占用状况
    • 类似于 Windows 的任务管理器
    • 在终端直接输入 top 即可使用
  • top 命令的功能是实时显示系统运行状态,包含处理器、内存、服务、进程等重要资产信息。
  • 运维工程师们常常会把 top 命令比作“加强版的 Windows 任务管理器”,因为除了能看到常规的服务进程信息之外,还能够对处理器和内存的负载情况一目了然,实时感知系统全局的运行状态。
  • top 命令非常适合作为接手服务器后执行的第一条命令。
  • 语法格式:top 参数 对象
参数描述
-a按内存使用情况排序
-b使用批处理模式,不进行交互式显示
-c使用显示模式
-d设置显示的更新速度
-h显示帮助信息
-i不显示任何闲置或僵死的行程
-M显示内存单位
-n设置显示的总次数,完成后自动退出
-p仅显示指定进程 ID
-s使用安全模式,不允许交互式指令
-u仅显示与指定用户 ID 相关的进程
-v使用线程模式
-w设置显示的宽度

top 指令与 Windows 任务管理器对比

77472a89-4023-4fc1-acf9-10d691cde033

top 指令输出各指标含义

`top`命令的输出会实时更新,你可以通过按下不同的键来改变显示的选项或者排序方式。

  • 1 可以显示所有 CPU 的使用情况
  • m 可以按内存使用情况排序

统计信息区

bash
  ~ top
top - 18:23:22 up 6 days,  9:11,  2 users,  load average: 0.01, 0.09, 0.04
Tasks: 131 total,   1 running, 129 sleeping,   0 stopped,   1 zombie
%Cpu(s):  0.4 us,  0.7 sy,  0.0 ni, 98.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   3658.8 total,    581.9 free,    689.1 used,   2760.4 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   2969.7 avail Mem
  • 第一行 top - 18:23:22 up 6 days, 9:11, 2 users, load average: 0.01, 0.09, 0.04

    • top:命令名称。
    • 18:23:22:当前系统时间。
    • up 6 days, 9:11:系统已经运行了 6 天 9 小时 11 分钟。
    • 2 users:当前有 2 个用户登录到系统。
    • load average: 0.01, 0.09, 0.04:系统在过去 1 分钟、5 分钟和 15 分钟内的平均负载。这三个数值越小,表示系统负载越低。
  • 第二行 Tasks: 131 total, 1 running, 129 sleeping, 0 stopped, 1 zombie

    • Tasks:任务(进程)总数。
    • 131 total:当前系统总共有 131 个任务(进程)。
    • 1 running:有 1 个进程正在运行。
    • 129 sleeping:有 129 个进程正在休眠状态。
    • 0 stopped:没有进程被停止。
    • 1 zombie:有 1 个僵尸进程(已结束但未被父进程回收的进程)。
  • 第三行 %Cpu(s): 0.4 us, 0.7 sy, 0.0 ni, 98.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

    • %Cpu(s)::CPU 使用情况概览。
    • 0.4 us:用户空间占用 CPU 的百分比(user space)。
    • 0.7 sy:内核空间占用 CPU 的百分比(system)。
    • 0.0 ni:改变过优先级的进程占用 CPU 的百分比(nice)。
    • 98.9 id:CPU 空闲的百分比(idle)。
    • 0.0 wa:等待 I/O 完成的 CPU 时间百分比(iowait)。
    • 0.0 hi:硬件中断占用 CPU 的百分比(hardware interrupt)。
    • 0.0 si:软件中断占用 CPU 的百分比(software interrupt)。
    • 0.0 st:虚拟机偷取时间 (被其他操作系统偷走的)(steal time),在虚拟化环境中,当宿主机使用虚拟 CPU 时,虚拟 CPU 等待真实 CPU 的时间。
      • 0.0 st - 这个参数仅在虚拟机内有
      • 如果这个参数过高,表明云服务提供商超卖严重
  • 第四行 MiB Mem : 3658.8 total, 581.9 free, 689.1 used, 2760.4 buff/cache

    • MiB Mem:内存使用情况(以 MiB 为单位)。
    • 3658.8 total:总内存量。
    • 581.9 free:空闲内存量。
    • 689.1 used:已使用的内存量。
    • 2760.4 buff/cache:用于缓冲和缓存的内存量。
  • 第五行 MiB Swap: 0.0 total, 0.0 free, 0.0 used. 2969.7 avail Mem

    • MiB Swap:交换空间使用情况(以 MiB 为单位)。
    • 0.0 total:总交换空间量。
    • 0.0 free:空闲交换空间量。
    • 0.0 used:已使用的交换空间量。
    • 2969.7 avail Mem:可用于启动新应用程序的内存量(包括空闲内存和缓存内存)。

输出指标

bash
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   4997 root      20   0  567536  24996   5376 S   2.0   0.7  84:44.54 barad_agent
     18 root      20   0       0      0      0 I   0.3   0.0   1:46.27 rcu_preempt
   4427 root      20   0       0      0      0 I   0.3   0.0   0:00.20 kworker/0:1-events
  31520 root      20   0       0      0      0 I   0.3   0.0   0:00.14 kworker/u16:0-events_unbound
 845299 root      20   0 1026620 109876  33024 S   0.3   2.9  97:12.66 YDService
      1 root      20   0  172024  14336   9984 S   0.0   0.4   0:49.21 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.28 kthreadd
      3 root      20   0       0      0      0 S   0.0   0.0   0:00.00 pool_workqueue_
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-rcu_g
      5 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-rcu_p
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-slub_
      7 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-netns
     11 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/R-mm_pe
     13 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_tasks_kthre
     14 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_tasks_rude_
     15 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_tasks_trace
     16 root      20   0       0      0      0 S   0.0   0.0   0:36.20 ksoftirqd/0
     17 root       0 -20       0      0      0 S   0.0   0.0   0:00.37 pr/ttyS0
     19 root      rt   0       0      0      0 S   0.0   0.0   0:01.17 migration/0
     20 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/0
     22 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0
     23 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1
     24 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/1
     25 root      rt   0       0      0      0 S   0.0   0.0   0:01.37 migration/1
     26 root      20   0       0      0      0 S   0.0   0.0   0:35.00 ksoftirqd/1
     28 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/1:0H-events_highpri
     29 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/2
     30 root     -51   0       0      0      0 S   0.0   0.0   0:00.00 idle_inject/2
     31 root      rt   0       0      0      0 S   0.0   0.0   0:01.41 migration/2
     32 root      20   0       0      0      0 S   0.0   0.0   0:36.15 ksoftirqd/2
     34 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/2:0H-events_highpri
     35 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/3
字段描述
PID进程 ID(Process ID),是操作系统为每个进程分配的唯一标识
USER进程的所有者(USER),启动该进程的用户
PR进程的优先级(Priority)。20 表示普通优先级,值越低优先级越高
NI进程的 nice 值(Nice value),负值表示更高的优先级,正值表示更低的优先级,0 表示没有调整
VIRT进程使用的虚拟内存总量(Virtual Memory Size),包括所有内存(物理内存 + 交换空间),单位为 KB
RES进程使用的常驻内存大小(Resident Memory Size),进程使用的物理内存量,单位为 KB
SHR进程使用的共享内存大小(Shared Memory Size),这些内存可以和其他进程共享,单位为 KB
S进程的状态(Status)
%CPU进程使用的 CPU 时间百分比
%MEM进程使用的内存百分比
TIME+进程运行的总时间,格式为 [DD-]HH:MM:SS
COMMAND启动进程的命令名
bash
PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
4997 root      20   0  567536  24996   5376 S   2.0   0.7  84:44.54 barad_agent
  • 进程 ID 为 4997,属于 root 用户。
  • 优先级为 20,nice 值为 0。
  • 虚拟内存使用量为 567536KB,常驻内存使用量为 24996KB,共享内存使用量为 5376KB。
  • 进程状态为 S(休眠)。
  • CPU 使用率为 2.0%。
  • 内存使用率为 0.7%。
  • 运行时间为 84 天 44 分钟 54 秒。
  • 命令名为 barad_agent。

进程状态(S 列)

状态描述详细说明
R运行 (Running)进程正在使用 CPU 或准备使用 CPU。在多核系统中,多个进程可以同时处于运行状态。
S睡眠 (Sleeping)进程在等待某个事件的完成,大多数进程在大多数时间里都是处于这种状态。可中断睡眠状态下的进程可以被信号打断。
D不可中断睡眠 (Uninterruptible Sleep)进程正在等待某个内核事件完成,不可被打断。这种状态通常表示进程在等待磁盘 I/O 操作完成。进程不能处理信号,直到其所等待的事件完成。
T停止 (Stopped)进程已停止运行,可能是因为接收到停止信号(如 SIGSTOP)或正在被调试。停止状态的进程可以通过接收 SIGCONT 信号恢复运行。
Z僵尸 (Zombie)进程已经终止,但其父进程尚未读取其退出状态。僵尸进程没有任何活动资源,但仍然保留进程 ID。父进程通过 wait() 系统调用来读取其退出状态并释放其进程 ID。
I空闲 (Idle)进程没有任何工作需要处理,常用于内核线程,表示其当前没有活动任务需要处理。

top 指令常用参数

参数说明
-b以批处理模式运行,适合将输出重定向到文件或其他命令。
-d delay设置更新之间的延迟时间(单位:秒)。默认值为 3 秒。
-n iter设置更新的次数,在达到指定次数后自动退出。
-p pid仅监视指定的进程 ID。
-u user显示特定用户的进程。
-H显示线程而不是进程。
-s启动时使屏幕不可滚动,适合在终端显示中避免屏幕滚动。
-i忽略闲置和僵尸进程。
-c显示完整的命令行而不是只显示命令名。
命令描述
top -b -n 1 > top_output.txt以批处理模式运行top,只执行一次,并将输出重定向到top_output.txt文件中。
top -d 5 -n 10设置top的刷新间隔为 5 秒,并且只运行 10 次后退出。
top -u username显示指定用户名为username的所有进程。
top -H -p 1234显示进程 ID 为 1234 的所有线程,而不是进程。-H选项用于显示线程级别的信息。
top -c显示完整的命令行信息,而不是只显示命令名。

top 指令交互参数

命令说明
h/? (help)显示帮助屏幕,列出所有命令。
k (kill)结束一个进程。输入k之后,会提示你输入要杀死的进程的 ID。
r (renice)重新调度一个进程,提示输入要改变优先级的进程 ID 和新优先级值。
q (quit)退出 top
s (seconds)改变刷新时间间隔。输入s后,需要输入新的时间(秒)。
P (CPU)按 CPU 使用排序。
M (Memory)按内存使用排序。
T (Time)按时间/累积时间排序。
f (field)进入或离开字段管理模式,可以选择要显示的字段。
m (memory)切换显示内存信息。
t (task)切换显示任务和 CPU 状态信息。
o (order)改变排序顺序,例如输入 o,然后 pid,可以按进程 ID 排序。
n (num)设置显示的任务数量。
u (user)显示特定用户的进程,提示输入用户名。
c (command)切换显示完整的命令行或仅显示命令名。
i (idle)切换是否显示闲置和僵尸进程。
b/B (bold)切换高亮显示当前活动进程。
l (load)切换显示平均负载和启动时间信息。
1切换显示每个 CPU 的状态信息。